<?php
/**
 * Vars
 * 標準一時ファイル管理モジュール
 * 
 * 基本的に他のモジュールから呼び出されるもので、単体で動くことはない。
 * 
 * @since 2012/01/24
 */
class Vars {
	public function __construct () {
		Y('Module')->add ($this, __CLASS__);
		
		// トップレベルにVar作成
		// これのcallはModule.Varsと同等
		$objTop = Y()->add ($this, 'Var');
		$objSystem = $objTop->add (null, 'System');
		$objSystem->add (Y::func($this, 'getSystemFile'), 'Get');
		$objSystem->add (Y::func($this, 'addSystemFile'), 'Add');
		$objSystem->add (Y::func($this, 'writeSystemFile'), 'Write');
		$objSystem->add (Y::func($this, 'removeSystemFile'),'Remove');

// 以降未実装。
		$objPublic = $objTop->add (null, 'Public');
		$objPublic->add (Y::func($this, 'getPublicFile'),'Get');
		$objSystem->add (Y::func($this, 'addPublicFile'), 'Add');
		$objSystem->add (Y::func($this, 'writePublicFile'), 'Write');
		$objSystem->add (Y::func($this, 'copyPublicFile'), 'Copy');
		$objPublic->add (Y::func($this, 'removePublicFile'), 'Remove');
	}

	/**
	 * call
	 * 
	 * 今のところ役割なし
	 * 
	 * @since 2012/01/24
	 */
	function call () {
	}

	/**
	 * getSystemFile
	 * システムの一時ファイルディレクトリ(初期ではyutori/vars)にあるファイルを読み込む。
	 * 
	 * @since 2012/01/24
	 * @param string $file ファイル名。DIR_VARS以降のファイル名になる。
	 * @return string 成功した場合内容を返す。失敗した場合false。
	 */
	 public function getSystemFile ($file) {
	 	if (!file_exists (DIR_VARS.$file)) return false;
	 	return file_get_contents (DIR_VARS.$file);
	 }

	/**
	 * addSystemFile
	 * システムの一時ファイルディレクトリ(初期ではyutori/vars)にあるファイルの末尾に追記する。
	 * 
	 * @since 2012/01/24
	 * @param string $file ファイル名。DIR_VARS以降のファイル名になる。
	 * @param string $contents 書きこむ内容の文字列。
	 * @return bool 成功した場合true。失敗した場合false。
	 */
	 public function addSystemFile ($file, $contents) {
		// ディレクトリがない場合は作成する
		if (!is_dir (dirname(DIR_VARS.$file))) mkdir (dirname(DIR_VARS.$file), 0777, true);
		if ($fp = fopen(DIR_VARS.$file, 'a')) {
			flock($fp, LOCK_EX);
			fputs($fp, $contents);
			fclose($fp);
			return true;
		}
		else return false;
	 }

	/**
	 * writeSystemFile
	 * システムの一時ファイルディレクトリ(初期ではyutori/vars)にあるファイルを書き換える。
	 * 元々の内容は破棄される。
	 * 
	 * @since 2012/01/24
	 * @param string $file ファイル名。DIR_VARS以降のファイル名になる。
	 * @param string $contents 書きこむ内容の文字列。
	 * @return bool 成功した場合true。失敗した場合false。
	 */
	 public function writeSystemFile ($file, $contents) {
	 	if (!file_exists (DIR_VARS.$file)) return false;

		// file_put_contentsは同時アクセスが危険なので使用しない。
		if ($fp = fopen(DIR_VARS.$file, 'c')) {
			flock($fp, LOCK_EX);
			ftruncate($fp, 0);
			fputs($fp, $contents);
			fclose($fp);
			return true;
		}
		else return false;
	 }

}

new Vars ();